﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;

using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GS1.Entidad;
using System.Diagnostics;
using log4net;
using System.Configuration;
using GS1.Utilitario;
using GS1.Negocio;
using GS1.Datos;
// Reference the API
using ThingMagic;


namespace Demo.Formularios
{
    public partial class frmNuevo : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmNuevo));
        private const string TITULO = "CONFIRMACIÓN";

        private  RFIDState estadoReader;
        private enum RFIDState
        {
            CONECTADO,
            DESCONECTADO
        }

        Uri objUri;
        Reader reader;

        private Etiqueta etiqueta = null;
        private string nvehiculo = null;
        private string epc = null;
        private Vehiculo vehiculo = null;
        #endregion

        #region --- Constructor ---
        public frmNuevo()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos del Reader ---  

        #endregion 

 
        #region --- Eventos Formulario ---
        private void frmNuevo_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void frmNuevo_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (this.estadoReader == RFIDState.CONECTADO) { CambiarEstadoReader(); }
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            grabar();
        }
        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        #endregion

        #region --- Metodos Propios ---

        private void cargarFormulario()
        {
            try
            {
                this.estadoReader = RFIDState.DESCONECTADO;
                //Obteniendo datos de terminal/usuario/bd Actual
                this.lblFechaActual.Text = Convert.ToString(DateTime.Now.Date);
                this.lblTerminal.Text = Constantes.NOMBRE_COMPUTADORA;
                this.lblPerfil.Text = Constantes.BD_CONEXION + "-" + Constantes.PERFIL_USUARIO + "-" + Constantes.CODIGO_USUARIO;
                this.lblOficina.Text = Constantes.NOMBRE_EMPRESA + "-" + Constantes.NOMBRE_OFICINA;
                this.txtAcceso.Text = Constantes.ACCE_PASS;
                this.txtBloqueo.Text = Constantes.KILL_PASS;
                this.cbIndicador.Items.Add(Constantes.ESTADO_DESCRIPCION_ACTIVO);
                this.cbIndicador.Items.Add(Constantes.ESTADO_DESCRIPCION_INACTIVO);


            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, this.Text);
            }
        }

        private void CambiarEstadoReader()
        {
           //AGREGAR CONEXIÓN CON READER Y cambiar de estado
           
            this.estadoReader = RFIDState.CONECTADO;
        }

/*
       private void CambiarEstadoReader()
        {
            try
            {
                if (this.estadoReader == RFIDState.DESCONECTADO)
                {
                    Uri objUri;
                    Reader reader;

                    try
                    {
                        objUri = new Uri(uriString);
                    }
                    catch (UriFormatException e)
                    {
                        throw new ReaderException(e.Message);
                    }

                    String scheme = objUri.Scheme;

                    if (scheme == null)
                    {
                        throw new ReaderException("eapi"); //"Blank URI scheme"
                    }
#if !WindowsCE
                    if (scheme.Equals("tmr"))
                    {
                        if (objUri.Host != null && objUri.Host != "")
                        {
                            reader = new LlrpReader(objUri.Host, objUri.Port);
                            if (((LlrpReader)reader).IsLlrpReader())
                            {
                                reader.uri = objUri;
                                return reader;
                            }
                            else
                            {
                                reader.Destroy();
                                reader = null;
                                scheme = "rql";
                            }
                        }
                        else
                        {
                            scheme = "eapi";
                        }
                    }
#endif
                    switch (scheme)
                    {
                        case "eapi":
                            reader = new SerialReader(objUri.PathAndQuery);
                            break;
                        case "rql":

                            if ("" == objUri.Host)
                                throw new ArgumentException("Must provide a host name for URI (rql://hostname)");

                            if (!(("" == objUri.PathAndQuery) || ("/" == objUri.PathAndQuery)))
                                throw new ArgumentException("Path not supported for " + objUri.Scheme + " URIs");

                            reader = new RqlReader(objUri.Host, objUri.Port);
                            break;
#if !WindowsCE
                        case "llrp":

                            if ("" == objUri.Host)
                                throw new ArgumentException("Must provide a host name for URI (llrp://hostname)");

                            if (!(("" == objUri.PathAndQuery) || ("/" == objUri.PathAndQuery)))
                                throw new ArgumentException("Path not supported for " + objUri.Scheme + " URIs");

                            reader = new LlrpReader(objUri.Host, objUri.Port);

                            break;
#endif
                        default:
                            throw new ReaderException("Unknown URI scheme: " + objUri.Scheme + " in " + uriString);
                    }
                    reader.uri = objUri;
                    return reader;
                }
            }
            catch (Exception ex)
            {
                this.txtMensajes.Text = ex.ToString();
            }
        }*/

        private void generarEpc()
        {
            this.epc = "340833B2DDD9";

            string nvehiculo = this.txtNVehiculo.Text;

            for (int i = 0; i < nvehiculo.Length; i++)

            {
                switch (nvehiculo.Substring(i,1))
                    {
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_GUION_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_GUION_HEXA;
                                break;
                        }
                        
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_PUNTO_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_PUNTO_HEXA;
                            break;
                        }  
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_A_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_A_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_B_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_B_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_C_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_C_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_D_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_D_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_E_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_E_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_F_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_F_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_G_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_G_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_H_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_H_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_I_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_I_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_J_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_J_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_K_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_K_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_L_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_L_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_M_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_M_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_N_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_N_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_O_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_O_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_P_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_P_HEXA;
                             break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Q_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Q_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_R_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_R_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_S_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_S_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_T_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_T_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_U_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_U_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_V_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_V_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_W_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_W_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_X_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_X_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Y_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Y_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Z_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Z_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_0_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_0_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_1_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_1_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_2_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_2_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_3_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_3_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_4_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_4_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_5_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_5_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_6_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_6_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_7_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_7_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_8_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_8_HEXA;
                            break;
                        }
                        case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_9_DES: 
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_9_HEXA;
                            break;
                        }

                       }

                }

            }



        private void grabar()
        {
            if (this.txtNVehiculo.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtNVehiculo, "Debe ingresar número de documento", TITULO);
                return;
            }
            if (this.cbIndicador.SelectedItem.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtNVehiculo, "Debe seleccionar estado", TITULO);
                return;
            }
            if (this.estadoReader == RFIDState.DESCONECTADO)
            {
                CambiarEstadoReader();
            }

            if (this.estadoReader == RFIDState.CONECTADO)
            {
                MessageBox.Show("Coloque la etiqueta encima del lector", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information);
                
                    generarEpc();

                    MessageBox.Show("Conexión con lector confirmada", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                
                    //Se confirma que el código no este registrado previamente
                if (!validaActivo())
                {
                        MessageBox.Show("Esta etiqueta ya está asociada a un vehículo", TITULO, MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                }
                
                if (MessageBox.Show("Proceso de grabación no retire la etiqueta", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    //Graba etiqueta con reader
                    grabaEpc();
                }
                if (MessageBox.Show("Grabado. No retire etiqueta. Pulse aceptar para bloquear acceso", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    //Bloquea Etiqueta
                    bloquearAcceso();
                }
                if (MessageBox.Show("Guardando. Pulse aceptar", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    //Graba código EPC-Vehículo en Base de Datos
                    if (guardarEpc())
                    {
                        MessageBox.Show("Proceso terminado", TITULO, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        //Se detuvo la grabación por problemas en BD
                        MessageBox.Show("No se registro etiqueta", TITULO, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }
        private void grabaEpc()
        {
        } 
        private void bloquearAcceso()
        {
        }
        private bool validaActivo()
        {
            Etiqueta etiqueta = null;
            Etiqueta etiquetaObtenido = null;
         try
            {
            etiqueta = new Etiqueta();
            etiqueta.codEpc = this.epc;
            etiquetaObtenido = new EtiquetaBL().obtenerEtiqueta(etiqueta);
            }
            
         catch (Exception ex)
            {
                Libreria.MensajeError(ex);
            }

            return etiquetaObtenido == null;
        }

        private bool guardarEpc()
        {
            Etiqueta etiqueta = null;
            bool respuesta = false;
            try
            {
                etiqueta = new Etiqueta();
                etiqueta.codEpc = this.epc;
                etiqueta.codvehiculo = this.vehiculo.codvehiculo;
                if (this.cbIndicador.SelectedText.Equals(Constantes.ESTADO_DESCRIPCION_ACTIVO))
                {
                    etiqueta.indicador = Convert.ToInt32(Constantes.ESTADO_CODIGO_ACTIVO);
                }
                else
                {
                    etiqueta.indicador = Convert.ToInt32(Constantes.ESTADO_CODIGO_INACTIVO);
                }
                etiqueta.nomCompCrea = Convert.ToString(ConfigurationManager.AppSettings[Constantes.NOMBRE_COMPUTADORA].desEncriptarDES(ConfigurationManager.AppSettings[Constantes.LLAVE_3DS]).ToString());
                etiqueta.codUsuaCrea = ConfigurationManager.AppSettings[Constantes.CODIGO_USUARIO].desEncriptarDES(ConfigurationManager.AppSettings[Constantes.LLAVE_3DS]).ToString();
                etiqueta.fechaCreacion = DateTime.Now;

                respuesta = new EtiquetaBL().registrarEtiqueta(etiqueta);
            }
            catch (Exception ex)
            {
                Libreria.MensajeError(ex);
            }
            return respuesta;
        }
        private void salir()
        {
            this.Close();
        }
        /*
        private void grabar()
        {
            if (this.txtNVehiculo.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtNVehiculo, "Debe ingresar número de documento", TITULO);
                return;
            }
            if (this.cbIndicador.SelectedItem.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtNVehiculo, "Debe seleccionar estado", TITULO);
                return;
            }
            if (this.estadoReader == RFIDState.DESCONECTADO)
            {
                CambiarEstadoReader();
            }

            if (this.estadoReader == RFIDState.CONECTADO)
            {
                if (MessageBox.Show("Coloque la etiqueta encima del lector", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    generarEpc();
                }
                if (MessageBox.Show("Conexión con lector confirmada", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    //Se confirma que el código no este registrado previamente
                    if (!validaActivo())
                    {
                        MessageBox.Show("Esta etiqueta ya está asociada a un vehículo", TITULO, MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                }
                if (MessageBox.Show("Proceso de grabación no retire la etiqueta", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    //Graba etiqueta con reader
                    grabaEpc();
                }
                if (MessageBox.Show("Grabado. No retire etiqueta. Pulse aceptar para bloquear acceso", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    //Bloquea Etiqueta
                    bloquearAcceso();
                }
                if (MessageBox.Show("Guardando. Pulse aceptar", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    //Graba código EPC-Vehículo en Base de Datos
                    if (guardarEpc())
                    {
                        MessageBox.Show("Proceso terminado", TITULO, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        //Se detuvo la grabación por problemas en BD
                        MessageBox.Show("No se registro etiqueta", TITULO, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }*/
        #endregion
    }
}
